Micron Document
NexusPi Git Node


Displaying Raw • Download

lib/microReticulum/src/Utilities/Persistence.h copilot/add-rtnode-configuration-options (9529fa8a) Text, 24.30 KB

Tff7b72#Tff7b72pragma once

T8b949e// CBA NOTE If headers for classes referenced in this file are not included here,
T8b949e// then they MUST be included BEFORE this header is included.
Tff7b72#Tff7b72include T8b949e"Transport.h"
Tff7b72#Tff7b72include T8b949e"Type.h"
Tff7b72#Tff7b72include T8b949e"Utilities/OS.h"

Tff7b72#Tff7b72include T8b949e<ArduinoJson.h>

Tff7b72#Tff7b72include T8b949e<map>
Tff7b72#Tff7b72include T8b949e<vector>
Tff7b72#Tff7b72include T8b949e<set>
Tff7b72#Tff7b72include T8b949e<string>

Te6edf3namespace Te6edf3ArduinoJson Tb4b4b4{

T8b949e// ArduinoJSON serialization support for std::vector<T>
Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3TTff7b72>Tff7b72> Tb4b4b4{
Tff7b72static Tffa657void Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3TTff7b72>Tff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ff<<< Serializing vectorTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3JsonArray Te6edf3array Tff7b72= Te6edf3dstTb4b4b4.Te6edf3toTff7b72<Te6edf3JsonArrayTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3T Te6edf3item Tff7b72: Te6edf3srcTb4b4b4)
Te6edf3arrayTb4b4b4.Te6edf3addTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ff<<< Finished serializing vectorTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3TTff7b72> Te6edf3fromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ff<<< Deserializing vectorTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3TTff7b72> Te6edf3dstTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3T Te6edf3item Tff7b72: Te6edf3srcTb4b4b4.Te6edf3asTff7b72<Te6edf3JsonArrayConstTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3dstTb4b4b4.Te6edf3push_backTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4;
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ff<<< Finished deserializing vectorTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Te6edf3checkJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3JsonArrayConst Te6edf3array Tff7b72= Te6edf3srcTb4b4b4;
Tffa657bool Te6edf3result Tff7b72= Te6edf3arrayTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonVariantConst Te6edf3item Tff7b72: Te6edf3arrayTb4b4b4)
Te6edf3result Tff7b72&Tff7b72= Te6edf3itemTb4b4b4.Te6edf3isTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e// ArduinoJSON serialization support for std::set<T>
Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3TTff7b72>Tff7b72> Tb4b4b4{
Tff7b72static Tffa657void Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3TTff7b72>Tff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
Te6edf3JsonArray Te6edf3array Tff7b72= Te6edf3dstTb4b4b4.Te6edf3toTff7b72<Te6edf3JsonArrayTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3T Te6edf3item Tff7b72: Te6edf3srcTb4b4b4)
Te6edf3arrayTb4b4b4.Te6edf3addTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3TTff7b72> Te6edf3fromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3TTff7b72> Te6edf3dstTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3T Te6edf3item Tff7b72: Te6edf3srcTb4b4b4.Te6edf3asTff7b72<Te6edf3JsonArrayConstTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3dstTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3itemTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Te6edf3checkJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3JsonArrayConst Te6edf3array Tff7b72= Te6edf3srcTb4b4b4;
Tffa657bool Te6edf3result Tff7b72= Te6edf3arrayTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonVariantConst Te6edf3item Tff7b72: Te6edf3arrayTb4b4b4)
Te6edf3result Tff7b72&Tff7b72= Te6edf3itemTb4b4b4.Te6edf3isTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e// ArduinoJSON serialization support for std::map<std::string, T>
Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3stringTb4b4b4, Te6edf3TTff7b72>Tff7b72> Tb4b4b4{
Tff7b72static Tffa657void Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3stringTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
Te6edf3JsonObject Te6edf3obj Tff7b72= Te6edf3dstTb4b4b4.Te6edf3toTff7b72<Te6edf3JsonObjectTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72autoTff7b72& Te6edf3item Tff7b72: Te6edf3srcTb4b4b4)
Te6edf3objTb4b4b4[Te6edf3itemTb4b4b4.Te6edf3firstTb4b4b4] Tff7b72= Te6edf3itemTb4b4b4.Te6edf3secondTb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3stringTb4b4b4, Te6edf3TTff7b72> Te6edf3fromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3stringTb4b4b4, Te6edf3TTff7b72> Te6edf3dstTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonPairConst Te6edf3item Tff7b72: Te6edf3srcTb4b4b4.Te6edf3asTff7b72<Te6edf3JsonObjectConstTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3dstTb4b4b4[Te6edf3itemTb4b4b4.Te6edf3keyTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3c_strTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Te6edf3itemTb4b4b4.Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Te6edf3checkJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3JsonObjectConst Te6edf3obj Tff7b72= Te6edf3srcTb4b4b4;
Tffa657bool Te6edf3result Tff7b72= Te6edf3objTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonPairConst Te6edf3item Tff7b72: Te6edf3objTb4b4b4)
Te6edf3result Tff7b72&Tff7b72= Te6edf3itemTb4b4b4.Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e// ArduinoJSON serialization support for std::map<Bytes, T>
Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72> Tb4b4b4{
Tff7b72static Tffa657void Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
Te6edf3JsonObject Te6edf3obj Tff7b72= Te6edf3dstTb4b4b4.Te6edf3toTff7b72<Te6edf3JsonObjectTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72autoTff7b72& Te6edf3item Tff7b72: Te6edf3srcTb4b4b4) Tb4b4b4{
T8b949e//obj[item.first] = item.second;
Te6edf3objTb4b4b4[Te6edf3itemTb4b4b4.Te6edf3firstTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4] Tff7b72= Te6edf3itemTb4b4b4.Te6edf3secondTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72static Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTb4b4b4, Te6edf3TTff7b72> Te6edf3fromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTb4b4b4, Te6edf3TTff7b72> Te6edf3dstTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonPairConst Te6edf3item Tff7b72: Te6edf3srcTb4b4b4.Te6edf3asTff7b72<Te6edf3JsonObjectConstTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e//dst[item.key().c_str()] = item.value().as<T>();
Te6edf3RNSTff7b72:Tff7b72:Te6edf3Bytes Te6edf3keyTb4b4b4;
Te6edf3keyTb4b4b4.Te6edf3assignHexTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3keyTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3c_strTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e//dst[key] = item.value().as<T>();
Te6edf3dstTb4b4b4.Te6edf3insertTb4b4b4(Tb4b4b4{Te6edf3keyTb4b4b4, Te6edf3itemTb4b4b4.Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Te6edf3checkJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Te6edf3JsonObjectConst Te6edf3obj Tff7b72= Te6edf3srcTb4b4b4;
Tffa657bool Te6edf3result Tff7b72= Te6edf3objTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3JsonPairConst Te6edf3item Tff7b72: Te6edf3objTb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72&Tff7b72= Te6edf3itemTb4b4b4.Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e/*
// ArduinoJSON serialization support for RNS::Bytes
template <>
struct Converter<RNS::Bytes> {
static bool toJson(const RNS::Bytes& src, JsonVariant dst) {
//TRACE("<<< Serializing Bytes");
//TRACE("<<< Finished serializing Bytes");
return true;
}
static RNS::Bytes fromJson(JsonVariantConst src) {
Bytes bytes;
//TRACE(">>> Deserializing Bytes");
//TRACE(">>> Finished deserializing Bytes");
return bytes;
}
static bool checkJson(JsonVariantConst src) {
return
src.is<RNS::Bytes>();
}
};
*/

T8b949e/*
// ArduinoJSON serialization support for RNS::Interface
template <>
struct Converter<RNS::Interface> {
static bool toJson(const RNS::Interface& src, JsonVariant dst) {
if (!src) {
return dst.set(nullptr);
}
//TRACE("<<< Serializing interface hash " + src.get_hash().toHex());
return dst.set(src.get_hash().toHex());
}
static RNS::Interface fromJson(JsonVariantConst src) {
if (!src.isNull()) {
RNS::Bytes hash;
hash.assignHex(src.as<const char*>());
//TRACE(">>> Deserialized interface hash " + hash.toHex());
//TRACE(">>> Querying transport for interface");
// Query transport for matching interface
return RNS::Transport::find_interface_from_hash(hash);
}
else {
return {RNS::Type::NONE};
}
}
static bool checkJson(JsonVariantConst src) {
return src.is<const char*>() && strlen(src.as<const char*>()) == 64;
}
};
*/

T8b949e/*
// ArduinoJSON serialization support for RNS::Packet
template <>
struct Converter<RNS::Packet> {
static bool toJson(const RNS::Packet& src, JsonVariant dst) {
if (!src) {
return dst.set(nullptr);
}
//TRACE("<<< Serializing packet hash " + src.get_hash().toHex());
// Whenever a reference to a packet is serialized we must ensure that packet itself also gets serialized separately
RNS::Transport::cache_packet(src, true);
return dst.set(src.get_hash().toHex());
}
static RNS::Packet fromJson(JsonVariantConst src) {
if (!src.isNull()) {
RNS::Bytes hash;
hash.assignHex(src.as<const char*>());
//TRACE(">>> Deserialized packet hash " + hash.toHex());
//TRACE(">>> Querying transport for cached packet");
// Query transport for matching packet
return RNS::Transport::get_cached_packet(hash);
}
else {
return {RNS::Type::NONE};
}
}
static bool checkJson(JsonVariantConst src) {
return src.is<const char*>() && strlen(src.as<const char*>()) == 64;
}
};
*/
T8b949e// ArduinoJSON serialization support for RNS::Packet
Te6edf3template Tff7b72<Tff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3PacketTff7b72> Tb4b4b4{
Tff7b72static Tffa657bool Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3PacketTff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
T8b949e//TRACE("<<< Serializing Packet");
T8b949e//dst["hash"] = src.get_hash();
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3rawTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3sent_atTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3get_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e//TRACE("<<< Finished serializing Packet");
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3RNSTff7b72:Tff7b72:Te6edf3Packet Td2a8fffromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
T8b949e//TRACE(">>> Deserializing Packet");
Te6edf3RNSTff7b72:Tff7b72:Te6edf3Bytes Te6edf3raw Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4;
T8b949e//RNS::Bytes raw = src["raw"].as<const RNS::Bytes&>();
Te6edf3RNSTff7b72:Tff7b72:Te6edf3Packet Te6edf3packetTb4b4b4(Te6edf3RNSTff7b72:Tff7b72:Te6edf3DestinationTb4b4b4(Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3NONETb4b4b4)Tb4b4b4, Te6edf3rawTb4b4b4)Tb4b4b4;
T8b949e//packet.set_hash(src["hash"]);
Te6edf3packetTb4b4b4.Te6edf3sent_atTb4b4b4(Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3RNSTff7b72:Tff7b72:Te6edf3Bytes Te6edf3destination_hash Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4;
T8b949e// set cached flag since pcket was read from cache
Te6edf3packetTb4b4b4.Te6edf3cachedTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
T8b949e//TRACE(">>> Finished deserializing Packet");
Tff7b72return Te6edf3packetTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Td2a8ffcheckJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Tff7b72return
T8b949e//src["hash"].is<RNS::Bytes>() &&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Tffa657doubleTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

T8b949e// ArduinoJSON serialization support for RNS::Transport::PacketEntry
Te6edf3template Tff7b72<Tff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PacketEntryTff7b72> Tb4b4b4{
Tff7b72static Tffa657bool Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PacketEntryTff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
T8b949e//TRACE("<<< Serializing Transport::PacketEntry");
T8b949e//dst["hash"] = src._hash;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_rawTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_sent_atTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_destination_hashTb4b4b4;
T8b949e//TRACE("<<< Finished serializing Transport::PacketEntry");
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PacketEntry Td2a8fffromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
T8b949e//TRACE(">>> Deserializing Transport::PacketEntry");
Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PacketEntry Te6edf3dstTb4b4b4;
T8b949e//dst._hash = src["hash"];
Te6edf3dstTb4b4b4.Te6edf3_raw Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_sent_at Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_destination_hash Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4;
T8b949e// set cached flag since pcket was read from cache
Te6edf3dstTb4b4b4.Te6edf3_cached Tff7b72= Tffa657trueTb4b4b4;
T8b949e//TRACE(">>> Finished deserializing Transport::PacketEntry");
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Td2a8ffcheckJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Tff7b72return
T8b949e//src["hash"].is<RNS::Bytes>() &&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffsent_atTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Tffa657doubleTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72#Tff7b72if 1
T8b949e// ArduinoJSON serialization support for RNS::Transport::DestinationEntry
Te6edf3template Tff7b72<Tff7b72>
Tff7b72struct T56d364ConverterTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3DestinationEntryTff7b72> Tb4b4b4{
Tff7b72static Tffa657bool Td2a8fftoJsonTb4b4b4(Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3DestinationEntryTff7b72& Te6edf3srcTb4b4b4, Te6edf3JsonVariant Te6edf3dstTb4b4b4) Tb4b4b4{
T8b949e//TRACE("<<< Serializing Transport::DestinationEntry");
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_timestampTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffreceived_fromTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_received_fromTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffannounce_hopsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_hopsTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_expiresTb4b4b4;
T8b949e// Trim random_blobs to PERSIST_RANDOM_BLOBS before writing to disk
Tff7b72if Tb4b4b4(Te6edf3srcTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PERSIST_RANDOM_BLOBSTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72> Te6edf3blob_vecTb4b4b4(Te6edf3srcTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3srcTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3sortTb4b4b4(Te6edf3blob_vecTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3blob_vecTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4(Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72& Te6edf3aTb4b4b4, Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72& Te6edf3bTb4b4b4) Tb4b4b4{
Tffa657uint64_t Te6edf3ts_a Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3from_bytes_big_endianTb4b4b4(Te6edf3aTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff5Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tffa657uint64_t Te6edf3ts_b Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3from_bytes_big_endianTb4b4b4(Te6edf3bTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff5Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3ts_a Tff7b72> Te6edf3ts_bTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72> Te6edf3trimmedTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3PERSIST_RANDOM_BLOBS Tff7b72&Tff7b72& Te6edf3i Tff7b72< Te6edf3blob_vecTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3trimmedTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3blob_vecTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffrandom_blobsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3trimmedTb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffrandom_blobsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_random_blobsTb4b4b4;
Tb4b4b4}
T8b949e/*
//dst["interface_hash"] = src._receiving_interface;
if (src._receiving_interface) {
dst["interface_hash"] = src._receiving_interface.get_hash();
}
else {
dst["interface_hash"] = nullptr;
}
// CBA TODO Move packet serialization to *after* destination table serialization since packets are useless
// anyway if there's no space to left to write destination table.
// Whenever a reference to a packet is serialized we must ensure that packet itself also gets serialized separately
//dst["packet"] = src._announce_packet;
if (src._announce_packet) {
dst["packet_hash"] = src._announce_packet.get_hash();
// Only cache packet if not already cached
if (!src._announce_packet.cached()) {
if (RNS::Transport::cache_packet(src._announce_packet, true)) {
const_cast<RNS::Packet&>(src._announce_packet).cached(true);
}
}
else {
TRACE("Destination announce packet " + src._announce_packet.get_hash().toHex() + " is already cached");
}
}
else {
dst["packet_hash"] = nullptr;
}
*/
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffinterface_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_receiving_interfaceTb4b4b4;
Te6edf3dstTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3srcTb4b4b4.Te6edf3_announce_packetTb4b4b4;
T8b949e//TRACE("<<< Finished Serializing Transport::DestinationEntry");
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72static Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3DestinationEntry Td2a8fffromJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
T8b949e//TRACE(">>> Deserializing Transport::DestinationEntry");
Te6edf3RNSTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3DestinationEntry Te6edf3dstTb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_timestamp Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_received_from Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffreceived_fromTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_hops Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffannounce_hopsTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_expires Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_random_blobs Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrandom_blobsTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3asTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Trim random_blobs loaded from flash to MAX_RANDOM_BLOBS
Tff7b72if Tb4b4b4(Te6edf3dstTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3MAX_RANDOM_BLOBSTb4b4b4) Tb4b4b4{
Te6edf3stdTff7b72:Tff7b72:Te6edf3vectorTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72> Te6edf3blob_vecTb4b4b4(Te6edf3dstTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dstTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3sortTb4b4b4(Te6edf3blob_vecTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3blob_vecTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4(Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72& Te6edf3aTb4b4b4, Tff7b72const Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72& Te6edf3bTb4b4b4) Tb4b4b4{
Tffa657uint64_t Te6edf3ts_a Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3from_bytes_big_endianTb4b4b4(Te6edf3aTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff5Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tffa657uint64_t Te6edf3ts_b Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3from_bytes_big_endianTb4b4b4(Te6edf3bTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4) Tff7b72+ T79c0ff5Tb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3ts_a Tff7b72> Te6edf3ts_bTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3TransportTff7b72:Tff7b72:Te6edf3MAX_RANDOM_BLOBS Tff7b72&Tff7b72& Te6edf3i Tff7b72< Te6edf3blob_vecTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3dstTb4b4b4.Te6edf3_random_blobsTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3blob_vecTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/*
//dst._receiving_interface = src["interface_hash"];
RNS::Bytes interface_hash = src["interface_hash"];
if (interface_hash) {
// Query transport for matching interface
dst._receiving_interface = RNS::Transport::find_interface_from_hash(interface_hash);
}
//dst._announce_packet = src["packet"];
RNS::Bytes packet_hash = src["packet_hash"];
if (packet_hash) {
// Query transport for matching packet
dst._announce_packet = RNS::Transport::get_cached_packet(packet_hash);
}
*/
Te6edf3dstTb4b4b4.Te6edf3_receiving_interface Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffinterface_hashTa5d6ff"Tb4b4b4]Tb4b4b4;
Te6edf3dstTb4b4b4.Te6edf3_announce_packet Tff7b72= Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4]Tb4b4b4;
T8b949e/*
//RNS::Transport::DestinationEntry dst(src["timestamp"], src["received_from"], src["announce_hops"], src["expires"], src["random_blobs"], src["receiving_interface"], src["packet"]);
RNS::Transport::DestinationEntry dst(
src["timestamp"].as<double>(),
src["received_from"].as<RNS::Bytes>(),
src["announce_hops"].as<int>(),
src["expires"].as<double>(),
src["random_blobs"].as<std::set<RNS::Bytes>>(),
src["receiving_interface"].as<RNS::Interface>(),
src["packet"].as<RNS::Packet>()
);
*/
T8b949e//TRACE(">>> Finished Deserializing Transport::DestinationEntry");
Tff7b72return Te6edf3dstTb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657bool Td2a8ffcheckJsonTb4b4b4(Te6edf3JsonVariantConst Te6edf3srcTb4b4b4) Tb4b4b4{
Tff7b72return
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Tffa657doubleTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffreceived_fromTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffannounce_hopsTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Tffa657intTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Tffa657doubleTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffrandom_blobsTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3stdTff7b72:Tff7b72:Te6edf3setTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffinterface_hashTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72&Tff7b72&
Te6edf3srcTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4]Tb4b4b4.Te6edf3isTff7b72<Te6edf3RNSTff7b72:Tff7b72:Te6edf3BytesTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72endif

Tb4b4b4}

Tff7b72#if 0
T8b949enamespace RNS {

T8b949e inline bool convertToJson(const Transport::DestinationEntry& src, JsonVariant dst) {
T8b949e //TRACE("<<< NEW Serializing Transport::DestinationEntry");
T8b949e dst["timestamp"] = src._timestamp;
T8b949e dst["received_from"] = src._received_from;
T8b949e dst["announce_hops"] = src._hops;
T8b949e dst["expires"] = src._expires;
T8b949e dst["random_blobs"] = src._random_blobs;
T8b949e/*
T8b949e //dst["interface_hash"] = src._receiving_interface;
T8b949e if (src._receiving_interface) {
T8b949e dst["interface_hash"] = src._receiving_interface.get_hash();
T8b949e }
T8b949e else {
T8b949e dst["interface_hash"] = nullptr;
T8b949e }
T8b949e // CBA TODO Move packet serialization to *after* destination table serialization since packets are useless
T8b949e // anyway if there's no space to left to write destination table.
T8b949e // Whenever a reference to a packet is serialized we must ensure that packet itself also gets serialized separately
T8b949e //dst["packet"] = src._announce_packet;
T8b949e if (src._announce_packet) {
T8b949e dst["packet_hash"] = src._announce_packet.get_hash();
T8b949e // Only cache packet if not already cached
T8b949e if (!src._announce_packet.cached()) {
T8b949e if (RNS::Transport::cache_packet(src._announce_packet, true)) {
T8b949e const_cast<RNS::Packet&>(src._announce_packet).cached(true);
T8b949e }
T8b949e }
T8b949e else {
T8b949e TRACE("Destination announce packet " + src._announce_packet.get_hash().toHex() + " is already cached");
T8b949e }
T8b949e }
T8b949e else {
T8b949e dst["packet_hash"] = nullptr;
T8b949e }
T8b949e*/
T8b949e dst["interface_hash"] = src._receiving_interface;
T8b949e dst["packet_hash"] = src._announce_packet;
T8b949e //TRACE("<<< Finished Serializing Transport::DestinationEntry");
T8b949e return true;
T8b949e }

T8b949e inline void convertFromJson(JsonVariantConst src, Transport::DestinationEntry& dst) {
T8b949e //TRACE(">>> NEW Deserializing Transport::DestinationEntry");
T8b949e dst._timestamp = src["timestamp"];
T8b949e dst._received_from = src["received_from"];
T8b949e dst._hops = src["announce_hops"];
T8b949e dst._expires = src["expires"];
T8b949e dst._random_blobs = src["random_blobs"].as<std::set<RNS::Bytes>>();
T8b949e/*
T8b949e //dst._receiving_interface = src["interface_hash"];
T8b949e RNS::Bytes interface_hash = src["interface_hash"];
T8b949e if (interface_hash) {
T8b949e // Query transport for matching interface
T8b949e dst._receiving_interface = RNS::Transport::find_interface_from_hash(interface_hash);
T8b949e }
T8b949e //dst._announce_packet = src["packet"];
T8b949e RNS::Bytes packet_hash = src["packet_hash"];
T8b949e if (packet_hash) {
T8b949e // Query transport for matching packet
T8b949e dst._announce_packet = RNS::Transport::get_cached_packet(packet_hash);
T8b949e }
T8b949e*/
T8b949e dst._receiving_interface = src["interface_hash"];
T8b949e dst._announce_packet = src["packet_hash"];
T8b949e/*
T8b949e //RNS::Transport::DestinationEntry dst(src["timestamp"], src["received_from"], src["announce_hops"], src["expires"], src["random_blobs"], src["receiving_interface"], src["packet"]);
T8b949e RNS::Transport::DestinationEntry dst(
T8b949e src["timestamp"].as<double>(),
T8b949e src["received_from"].as<RNS::Bytes>(),
T8b949e src["announce_hops"].as<int>(),
T8b949e src["expires"].as<double>(),
T8b949e src["random_blobs"].as<std::set<RNS::Bytes>>(),
T8b949e src["receiving_interface"].as<RNS::Interface>(),
T8b949e src["packet"].as<RNS::Packet>()
T8b949e );
T8b949e*/
T8b949e //TRACE(">>> Finished Deserializing Transport::DestinationEntry");
T8b949e }

T8b949e inline bool canConvertFromJson(JsonVariantConst src, const Transport::DestinationEntry&) {
T8b949e TRACE("=== NEW Checking Transport::DestinationEntry");
T8b949e return
T8b949e src["timestamp"].is<double>() &&
T8b949e src["received_from"].is<RNS::Bytes>() &&
T8b949e src["announce_hops"].is<int>() &&
T8b949e src["expires"].is<double>() &&
T8b949e src["random_blobs"].is<std::set<RNS::Bytes>>() &&
T8b949e src["interface_hash"].is<RNS::Bytes>() &&
T8b949e src["packet_hash"].is<RNS::Bytes>();
T8b949e }
T8b949e}
Tff7b72#endif

Te6edf3namespace Te6edf3RNS Tb4b4b4{ Te6edf3namespace Te6edf3Persistence Tb4b4b4{

T8b949e//static DynamicJsonDocument _document(Type::Persistence::DOCUMENT_MAXSIZE);
Tff7b72static Te6edf3JsonDocument Te6edf3_documentTb4b4b4;
Tff7b72static Te6edf3Bytes Td2a8ff_bufferTb4b4b4(Te6edf3TypeTff7b72:Tff7b72:Te6edf3PersistenceTff7b72:Tff7b72:Te6edf3BUFFER_MAXSIZETb4b4b4)Tb4b4b4;

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3crcTb4b4b4(Tff7b72const Te6edf3TTff7b72& Te6edf3objTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::crc<T>");
Te6edf3_documentTb4b4b4.Te6edf3setTb4b4b4(Te6edf3objTb4b4b4)Tb4b4b4;
Tffa657size_t Te6edf3size Tff7b72= Te6edf3_bufferTb4b4b4.Te6edf3capacityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef USE_MSGPACK
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72< Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3_bufferTb4b4b4.Te6edf3resizeTb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::crc: serialized %d bytesTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(T79c0ff0Tb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3serializeTb4b4b4(Tff7b72const Te6edf3TTff7b72& Te6edf3objTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::serialize<T>");
Te6edf3_documentTb4b4b4.Te6edf3setTb4b4b4(Te6edf3objTb4b4b4)Tb4b4b4;
Tffa657size_t Te6edf3size Tff7b72= Te6edf3_bufferTb4b4b4.Te6edf3capacityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef USE_MSGPACK
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72< Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3_bufferTb4b4b4.Te6edf3resizeTb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: serialized %d bytesTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4;
Tffa657size_t Te6edf3wrote Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3wrote Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3write_fileTb4b4b4(Te6edf3file_pathTb4b4b4, Te6edf3_bufferTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3wrote Tff7b72=Tff7b72= Te6edf3_bufferTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: wrote %d bytesTa5d6ff"Tb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: write failedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: failed to serializeTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3wroteTb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3deserializeTb4b4b4(Te6edf3TTff7b72& Te6edf3objTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::deserialize<T>");
Tffa657size_t Te6edf3read Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3read_fileTb4b4b4(Te6edf3file_pathTb4b4b4, Te6edf3_bufferTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3read Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: read: %d bytesTa5d6ff"Tb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e//TRACE("testDeserializeVector: data: " + _buffer.toString());
Tff7b72#Tff7b72ifdef USE_MSGPACK
Te6edf3DeserializationError Te6edf3error Tff7b72= Te6edf3deserializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3DeserializationError Te6edf3error Tff7b72= Te6edf3deserializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: successfully deserialized documentTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3obj Tff7b72= Te6edf3_documentTb4b4b4.Te6edf3asTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// CBA Following obj check doesn't work when T is a collection
T8b949e//if (obj) {
Tff7b72return Te6edf3readTb4b4b4;
T8b949e//}
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: failed to compose objectTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: failed to deserializeTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: read failedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72if 1
Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3crcTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3mapTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::crc<map<Bytes, T>>");

Tffa657uint32_t Te6edf3crc Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff{Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72autoTff7b72& Tb4b4b4[Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4] Tff7b72: Te6edf3mapTb4b4b4) Tb4b4b4{
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3hex Tff7b72= Te6edf3keyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Te6edf3hexTb4b4b4.Te6edf3c_strTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4;

Te6edf3_documentTb4b4b4.Te6edf3setTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tffa657size_t Te6edf3size Tff7b72= Te6edf3_bufferTb4b4b4.Te6edf3capacityTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef USE_MSGPACK
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3writableTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3length Tff7b72< Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3_bufferTb4b4b4.Te6edf3resizeTb4b4b4(Te6edf3lengthTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::crc: serialized entry %d bytesTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3_bufferTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
T8b949e// if failed to serialize entry then write empty entry
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff"Ta5d6ff{}Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3crc Tff7b72= Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff,Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3CrcTff7b72:Tff7b72:Te6edf3crc32Tb4b4b4(Te6edf3crcTb4b4b4, Ta5d6ff'Ta5d6ff}Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3serializeTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3mapTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3crcTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::serialize<map<Bytes,T>>");

T8b949e// CBA TODO: Use stream here instead to avoid having to buffer entire structure
Te6edf3RNSTff7b72:Tff7b72:Te6edf3FileStream Te6edf3stream Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3open_fileTb4b4b4(Te6edf3file_pathTb4b4b4, Te6edf3RNSTff7b72:Tff7b72:Te6edf3FileStreamTff7b72:Tff7b72:Te6edf3MODE_WRITETb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3streamTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: failed to open write streamTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff{Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tff7b72autoTff7b72& Tb4b4b4[Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4] Tff7b72: Te6edf3mapTb4b4b4) Tb4b4b4{
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3stdTff7b72:Tff7b72:Te6edf3string Te6edf3hex Tff7b72= Te6edf3keyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3hexTb4b4b4.Te6edf3c_strTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4;

Te6edf3_documentTb4b4b4.Te6edf3setTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef USE_MSGPACK
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tffa657size_t Te6edf3length Tff7b72= Te6edf3serializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: serialized entry %d bytesTa5d6ff"Tb4b4b4, Te6edf3lengthTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3length Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// if failed to serialize entry then write empty entry
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff"Ta5d6ff{}Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff,Ta5d6ff'Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3streamTb4b4b4.Te6edf3writeTb4b4b4(Ta5d6ff'Ta5d6ff}Ta5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::serialize: stream size: %d bytesTa5d6ff"Tb4b4b4, Te6edf3streamTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72= Te6edf3streamTb4b4b4.Te6edf3crcTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3streamTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3serializeTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3mapTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3crcTb4b4b4;
Tff7b72return Te6edf3serializeTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3file_pathTb4b4b4, Te6edf3crcTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3deserializeTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3mapTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3crcTb4b4b4) Tb4b4b4{
T8b949e//TRACE("Persistence::deserialize<map<Bytes,T>>");

T8b949e// CBA TODO: Use stream here instead to avoid having to buffer entire structure
Te6edf3RNSTff7b72:Tff7b72:Te6edf3FileStream Te6edf3stream Tff7b72= Te6edf3RNSTff7b72:Tff7b72:Te6edf3UtilitiesTff7b72:Tff7b72:Te6edf3OSTff7b72:Tff7b72:Te6edf3open_fileTb4b4b4(Te6edf3file_pathTb4b4b4, Te6edf3RNSTff7b72:Tff7b72:Te6edf3FileStreamTff7b72:Tff7b72:Te6edf3MODE_READTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3streamTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: failed to open read streamTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: size: %d bytesTa5d6ff"Tb4b4b4, Te6edf3streamTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;

Te6edf3mapTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3streamTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: read stream is emptyTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e// find opening brace
Tff7b72if Tb4b4b4(Te6edf3streamTb4b4b4.Te6edf3findTb4b4b4(Ta5d6ff'Ta5d6ff{Ta5d6ff'Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657char Te6edf3key_strTb4b4b4[Te6edf3RNSTff7b72:Tff7b72:Te6edf3TypeTff7b72:Tff7b72:Te6edf3ReticulumTff7b72:Tff7b72:Te6edf3DESTINATION_LENGTHTff7b72*T79c0ff2Tff7b72+T79c0ff1Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4;
Tff7b72do Tb4b4b4{
Te6edf3key_strTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// find map key opening quote
Tff7b72if Tb4b4b4(Te6edf3streamTb4b4b4.Te6edf3findTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3streamTb4b4b4.Te6edf3readBytesUntilTb4b4b4(Ta5d6ff'Ta5d6ff"Ta5d6ff'Tb4b4b4, Te6edf3key_strTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3key_strTb4b4b4)Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3Bytes Te6edf3keyTb4b4b4;
Te6edf3keyTb4b4b4.Te6edf3assignHexTb4b4b4(Te6edf3key_strTb4b4b4)Tb4b4b4;
Te6edf3TRACEFTb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: key: %sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3c_strTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3streamTb4b4b4.Te6edf3findTb4b4b4(Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72ifdef USE_MSGPACK
T8b949e//DeserializationError error = deserializeMsgPack(_document, _buffer.data());
Te6edf3DeserializationError Te6edf3error Tff7b72= Te6edf3deserializeMsgPackTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e//DeserializationError error = deserializeJson(_document, _buffer.data());
Te6edf3DeserializationError Te6edf3error Tff7b72= Te6edf3deserializeJsonTb4b4b4(Te6edf3_documentTb4b4b4, Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: successfully deserialized entryTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3T Te6edf3obj Tff7b72= Te6edf3_documentTb4b4b4.Te6edf3asTff7b72<Te6edf3TTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// CBA Following obj check doesn't work when T is a collection
T8b949e//if (obj) {
T8b949e// TRACE("Persistence::deserialize: failed to compose object");
T8b949e// break;
T8b949e//}
Te6edf3mapTb4b4b4.Te6edf3insertTb4b4b4(Tb4b4b4{Te6edf3keyTb4b4b4, Te6edf3objTb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3TRACETb4b4b4(Ta5d6ff"Ta5d6ffPersistence::deserialize: failed to deserialize entryTa5d6ff"Tb4b4b4)Tb4b4b4;
T8b949e//break;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3streamTb4b4b4.Te6edf3findTb4b4b4(Ta5d6ff'Ta5d6ff,Ta5d6ff'Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72breakTb4b4b4;
Tb4b4b4}

Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72while Tb4b4b4(Te6edf3key_strTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3crc Tff7b72= Te6edf3streamTb4b4b4.Te6edf3crcTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3streamTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3template Tff7b72<Te6edf3typename Te6edf3TTff7b72> Tffa657size_t Te6edf3deserializeTb4b4b4(Te6edf3stdTff7b72:Tff7b72:Te6edf3mapTff7b72<Te6edf3BytesTb4b4b4, Te6edf3TTff7b72>Tff7b72& Te6edf3mapTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3file_pathTb4b4b4) Tb4b4b4{
Tffa657uint32_t Te6edf3crcTb4b4b4;
Tff7b72return Te6edf3deserializeTb4b4b4(Te6edf3mapTb4b4b4, Te6edf3file_pathTb4b4b4, Te6edf3crcTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Tb4b4b4} Tb4b4b4}

Served by rngit 1.4.2 - Generated in 0.06s